{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 问题描述\n",
    "1. 以Lena为原始图像，通过OpenCV实现平均滤波，高斯滤波及中值滤波，比较滤波结果。 \n",
    "2. 以Lena为原始图像，通过OpenCV使用Sobel及Canny算子检测，比较边缘检测结果。 \n",
    "3. 在OpenCV安装目录下找到课程对应演示图片(安装目录\\sources\\samples\\data)，首先计算灰度直方图，进一步使用大津算法进行分割，并比较分析分割结果。 \n",
    "4. 使用米粒图像，分割得到各米粒，首先计算各区域(米粒)的面积、长度等信息，进一步计算面积、长度的均值及方差，分析落在3sigma范围内米粒的数量。 \n",
    "<br>扩展作业： \n",
    "5. 使用棋盘格及自选风景图像，分别使用SIFT、FAST及ORB算子检测角点，并比较分析检测结果。 \n",
    "(可选)使用Harris角点检测算子检测棋盘格，并与上述结果比较。 "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1. 以Lena为原始图像，通过OpenCV实现平均滤波，高斯滤波及中值滤波，比较滤波结果。 "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![avatar](./img/滤波结果.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "从结果不难发现，使用简单的平均滤波进行噪声消除往往以大幅度降低图像清晰度为代价；高斯滤波效果较好，虽然对图像也进行了模糊，但是相比平均滤波，更多地保留了图像总体的灰度分布特征平均滤波和高斯滤波本质上都是采取一种加权平均的思想将噪声的影响分散到其他像素上，而一个高亮度值无论怎么做平均，结果只能是削弱突兀的程度，而不能彻底根除。但在中值滤波处理的过程中，噪声点往往是直接被剔除掉，而且在降噪的同时引起的模糊效应也较低，因此中值滤波在处理椒盐噪声成效显著，对于上面的Lena图片并没有存在突兀的噪声点，效果不是特别明显，但是模糊程度比平均滤波要低。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2. 以Lena为原始图像，通过OpenCV使用Sobel及Canny算子检测，比较边缘检测结果。 "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![avatar](./img/边缘检测结果.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Sobel算子提取的轮廓明显没有Canny的那么细致，只是把一些明显轮廓的边缘提取出来了，而且有的轮廓线发虚；Canny算子通过调节阈值能将细致的边缘检测出来，而且轮廓线明亮清晰。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3. 在OpenCV安装目录下找到课程对应演示图片(安装目录\\sources\\samples\\data)，首先计算灰度直方图，进一步使用大津算法进行分割，并比较分析分割结果。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`灰度直方图`\n",
    "![avatar](./img/灰度直方图.png)\n",
    "\n",
    "pollen1图像亮度偏暗，因此像素主要集中在灰度低的一侧；pollen2图像的像素在低灰度和高灰度一侧都有分布，因此图像的对比度更高一些。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`大津算法进行全局阈值分割`\n",
    "![avatar](./img/大津算法图像分割结果1.png)\n",
    "![avatar](./img/大津算法图像分割结果2.png)\n",
    "![avatar](./img/大津算法图像分割结果3.png)\n",
    "\n",
    "由于大津算法全局阈值分割的局限性，对于存在很多噪声的图像和灰度渐变的图像，大津算法分割结果不太好。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "全局阈值分割的效果并不好，下面试试局部阈值分割\n",
    "\n",
    "改进:先通过形态学方法滤除噪声，再进行`局部阈值分割`\n",
    "![avatar](./img/局部阈值分割.png)\n",
    "\n",
    "gray窗口是滤除噪声后的灰度图像，再通过局部阈值法分割，获得了完整的米粒分割结果"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 4. 使用米粒图像，分割得到各米粒，首先计算各区域(米粒)的面积、长度等信息，进一步计算面积、长度的均值及方差，分析落在3sigma范围内米粒的数量。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![avatar](./img/米粒统计.png)\n",
    "\n",
    "面积落在3sigma范围内米粒的数量为93，长度落在3sigma范围内米粒的数量为92，总共检测到95粒米，可见绝大多数米粒都在范围内，在范围外的米粒数量为2～3"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 5. 使用棋盘格及自选风景图像，分别使用SIFT、FAST及ORB算子检测角点，并比较分析检测结果。 (可选)使用Harris角点检测算子检测棋盘格，并与上述结果比较。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`不同算子角点检测结果(风景图像)`\n",
    "![avatar](./img/角点检测算法对比结果.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "分析:ORB算法是由FAST算法改进而来，检测的特征点的质量ORB高于FAST，ORB检测出来的特征点更少一些，误检相对少一些；SIFT算法对于边缘光滑的目标无法准确提取特征点，比如图中建筑物拱形、偏圆形的地方没有检测出特征点，而SURF算法由SIFT算法改进而来，解决了SIFT的一些缺陷。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`对棋盘格进行角点检测`\n",
    "![avatar](./img/棋盘检测结果.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "分析:上述算法对棋盘角点检测效果都不太好，存在很多误检，FAST和ORB算法相对较好，SIFT算法在棋盘检测中暴露了对边缘光滑的目标检测不佳的缺陷，经过改进的SURF算法效果也不好。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`Harris角点检测结果`\n",
    "![avatar](./img/Harris检测结果.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "因为图中角点位置灰度积分变化明显，基于灰度积分变化原理的Harris算法角点检测效果相比上述算法要好。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
